package com.sheng.leetcode.year2023.month11.day02;

import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * @author by ls
 * @date 2023/11/2
 * <p>
 * 2103. 环和杆<p>
 * <p>
 * 总计有 n 个环，环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。<p>
 * 给你一个长度为 2n 的字符串 rings ，表示这 n 个环在杆上的分布。rings 中每两个字符形成一个 颜色位置对 ，用于描述每个环：<p>
 * 第 i 对中的 第一个 字符表示第 i 个环的 颜色（'R'、'G'、'B'）。<p>
 * 第 i 对中的 第二个 字符表示第 i 个环的 位置，也就是位于哪根杆上（'0' 到 '9'）。<p>
 * 例如，"R3G2B1" 表示：共有 n == 3 个环，红色的环在编号为 3 的杆上，绿色的环在编号为 2 的杆上，蓝色的环在编号为 1 的杆上。<p>
 * 找出所有集齐 全部三种颜色 环的杆，并返回这种杆的数量。<p>
 * <p>
 * 示例 1：<p>
 * 输入：rings = "B0B6G0R6R0R6G9"<p>
 * 输出：1<p>
 * 解释：<p>
 * - 编号 0 的杆上有 3 个环，集齐全部颜色：红、绿、蓝。<p>
 * - 编号 6 的杆上有 3 个环，但只有红、蓝两种颜色。<p>
 * - 编号 9 的杆上只有 1 个绿色环。<p>
 * 因此，集齐全部三种颜色环的杆的数目为 1 。<p>
 * <p>
 * 示例 2：<p>
 * 输入：rings = "B0R0G0R9R0B0G0"<p>
 * 输出：1<p>
 * 解释：<p>
 * - 编号 0 的杆上有 6 个环，集齐全部颜色：红、绿、蓝。<p>
 * - 编号 9 的杆上只有 1 个红色环。<p>
 * 因此，集齐全部三种颜色环的杆的数目为 1 。<p>
 * <p>
 * 示例 3：<p>
 * 输入：rings = "G4"<p>
 * 输出：0<p>
 * 解释：<p>
 * 只给了一个环，因此，不存在集齐全部三种颜色环的杆。<p>
 * <p>
 * 提示：<p>
 * rings.length == 2 * n<p>
 * 1 <= n <= 100<p>
 * 如 i 是 偶数 ，则 rings[i] 的值可以取 'R'、'G' 或 'B'（下标从 0 开始计数）<p>
 * 如 i 是 奇数 ，则 rings[i] 的值可以取 '0' 到 '9' 中的一个数字（下标从 0 开始计数）<p>
 */
public class LeetCode2103 {

    @Test
    public void test01() {
//        String rings = "B0B6G0R6R0R6G9";
//        String rings = "B0R0G0R9R0B0G0";
        String rings = "G4";
        System.out.println(new Solution().countPoints(rings));
    }
}

class Solution {
    public int countPoints(String rings) {
        int ans = 0;
        int n = rings.length() / 2;
        String[] split = rings.split("");
        Map<Integer, String> map = new HashMap<>();
        for (int i = 0; i < rings.length(); i += 2) {
            // split[i] 是环的颜色，split[i + 1] 是环所属的位置
            int parsed = Integer.parseInt(split[i + 1]);
            if (map.containsKey(parsed)) {
                if (!map.get(parsed).contains(split[i])) {
                    map.put(parsed, map.get(parsed) + split[i]);
                }
            } else {
                map.put(parsed, split[i]);
            }
        }
        for (Map.Entry<Integer, String> entry : map.entrySet()) {
            if (entry.getValue().length() == 3) {
                ans++;
            }
        }
        return ans;
    }
}
